home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Commun⁄Network / seer_family.v2.0 / Timing / timer.Pas < prev    next >
Pascal/Delphi Source File  |  1987-08-29  |  5KB  |  216 lines

  1. PROGRAM TestTimer;
  2. {Test millisecond timing routines. }
  3.     USES
  4.         TimingRoutines;
  5.     CONST
  6.         MaxTime = 3000;
  7.         MinTime = 100;
  8.         AppleMenu = 1;
  9.         FileMenu = 2;
  10.         EditMenu = 3;
  11.     VAR
  12.         count : LongInt;  {Milliseconds}
  13.         state : (waiting, starting, running, done);
  14.         Event : EventRecord;
  15.         TextRect, DrawingRect : Rect;
  16.         trial, sum : LongInt;
  17.  
  18.     PROCEDURE init;
  19.     BEGIN
  20.         InitCursor;
  21.         state := waiting;
  22.         SetRect(TextRect, 25, 50, 325, 320);
  23.         SetTextRect(TextRect);
  24.         SetRect(DrawingRect, 350, 50, 475, 175);
  25.         SetDrawingRect(DrawingRect);
  26.         SetRect(DrawingRect, 0, 0, 125, 125);
  27.         ShowText;
  28.         ShowDrawing;
  29.         TextSize(12);
  30.         TextFont(0);
  31.         Writeln('Click the mouse button when you ');
  32.         Writeln('see GO in the Drawing window.');
  33.         Writeln;
  34.         Writeln('Select START from FILE Menu to begin...');
  35.         Writeln;
  36.         InitTimer;
  37.         sum := 0;
  38.         trial := 1;
  39.     END;
  40.  
  41.  
  42.     PROCEDURE InitMenus;
  43.     { Init applications menus, add desk accessories to apple menu. }
  44.         VAR
  45.             MenuH : MenuHandle;
  46.             Apple : Str255;
  47.     BEGIN
  48.         Apple := chr(20);
  49.         Menuh := NewMenu(AppleMenu, Apple);
  50.         AddResMenu(MenuH, 'DRVR');
  51.         IF (CountMItems(MenuH) = 0) THEN
  52.             AppendMenu(MenuH, '(No accessories');
  53.         InsertMenu(MenuH, 0);
  54.         MenuH := NewMenu(FileMenu, 'File');
  55.         AppendMenu(MenuH, 'Start/S;Quit/Q');
  56.         InsertMenu(MenuH, 0);
  57.         MenuH := NewMenu(EditMenu, 'Edit');
  58.         AppendMenu(MenuH, 'Undo/Z;(-;Cut/X;Copy/C;Paste/V;Clear');
  59.         InsertMenu(MenuH, 0);
  60.         DrawMenuBar;
  61.     END;   { initmenus }
  62.  
  63.  
  64.     PROCEDURE DoMenu (VAR Event : EventRecord;
  65.                                     MenuChoice : LongInt);
  66.     { handle mouse click in menu bar; true if user chooses quit. }
  67.         VAR
  68.             MenuID, MenuItem : integer;
  69.             ItemName : str255;
  70.             Junk : integer;
  71.             SavePort : GrafPtr;
  72.     BEGIN
  73.         MenuID := HiWord(MenuChoice);
  74.         MenuItem := LoWord(MenuChoice);
  75.         CASE MenuID OF
  76.             AppleMenu : 
  77.                 BEGIN
  78.                     GetItem(GetMHandle(AppleMenu), MenuItem, ItemName);
  79.                     GetPort(SavePort);
  80.                     Junk := OpenDeskAcc(ItemName);
  81.                     SetPort(SavePort);
  82.                 END;
  83.             FileMenu : 
  84.                 CASE MenuItem OF
  85.                     1 : 
  86.                         state := starting;
  87.                     2 : 
  88.                         state := done;
  89.                 END;
  90.             EditMenu : 
  91.                 BEGIN
  92.                     GetItem(GetMHandle(EditMenu), MenuItem, ItemName);
  93.                     IF NOT SystemEdit(MenuItem - 1) THEN
  94.                         ;   { application handles, do nothing for now. }
  95.                 END;
  96.             OTHERWISE
  97.                 ;   { No Selection was made }
  98.         END;
  99.         HiLiteMenu(0);
  100.     END;   { DoMenu }
  101.  
  102.  
  103.     PROCEDURE DoMouse (VAR Event : EventRecord);
  104.     { handle mouse-down events; true if user chooses to quit. }
  105.         VAR
  106.             ThePart : integer;
  107.             WhichWindow : WindowPtr;
  108.     BEGIN
  109.         ThePart := FindWindow(Event.Where, WhichWindow);
  110.         CASE ThePart OF
  111.             InMenuBar : 
  112.                 DoMenu(Event, MenuSelect(Event.Where));
  113.             InSysWindow : 
  114.                 SystemClick(Event, WhichWindow);
  115.             InDesk, InContent, InDrag, InGrow, InGoAway : 
  116.                 ;
  117.             OTHERWISE
  118.                 ;
  119.         END;
  120.     END;   { DoMouse }
  121.  
  122.  
  123.     PROCEDURE DoKey (VAR Event : EventRecord);
  124.     { handle key-down events. }
  125.         VAR
  126.             c : char;
  127.     BEGIN
  128.         c := chr(BitAnd(Event.Message, 127));
  129.         IF (BitAnd(Event.Modifiers, CmdKey) = CmdKey) THEN
  130.             DoMenu(Event, MenuKey(c));
  131.     END;   { DoKey }
  132.  
  133.  
  134.     FUNCTION ButtonDown : boolean;
  135. { Returns true if mouse button is down; reads VIA directly because}
  136. {mousedown events are posted only at vertical retrace. }
  137.         CONST
  138.             VIABase = $1D4;
  139.         TYPE
  140.             VIA = PACKED ARRAY[0..7680] OF byte;
  141.         VAR
  142.             VIAPtr : ^VIA;
  143.             BasePtr : ^LongInt;
  144.     BEGIN
  145.         BasePtr := Pointer(VIABase);
  146.         VIAptr := Pointer(BasePtr^);
  147.         ButtonDown := (BitAnd(ViaPtr^[0], 8) = 0);
  148.     END;
  149.  
  150.     PROCEDURE HandlerEvents;
  151.     BEGIN
  152.         SystemTask;
  153.         IF GetNextEvent(EveryEvent, Event) THEN
  154.             CASE Event.What OF
  155.                 MouseDown : 
  156.                     DoMouse(Event);
  157.                 KeyDown : 
  158.                     DoKey(Event);
  159.                 OTHERWISE
  160.                     ;   { ignore all other events }
  161.             END;
  162.     END;
  163.  
  164.  
  165.     PROCEDURE DoOneTrial;
  166.         LABEL
  167.             99;
  168.         VAR
  169.             ticks, SaveTicks : LongInt;
  170.     BEGIN
  171.         SaveTicks := TickCount;
  172.         REPEAT
  173.             HandlerEvents;
  174.             IF state = done THEN
  175.                 GOTO 99;
  176.         UNTIL TickCount >= (SaveTicks + Random MOD 120 + (120));
  177.         MoveTo(50, 50);
  178.         REPEAT
  179.         UNTIL (TickCount <> ticks); {Wait for vertical retrace}
  180.         DrawString('Go');
  181.         ResetTimer;
  182.         REPEAT
  183.             count := TimerValue;
  184.         UNTIL ButtonDown OR (count >= MaxTime);
  185.         MoveTo(50, 50);
  186.         EraseRect(DrawingRect);
  187.         IF (Count < MaxTime) THEN
  188.             BEGIN
  189.                 sum := sum + count;
  190.                 writeln(trial : 10, Count : 10, sum / trial : 10 : 1);
  191.                 trial := trial + 1;
  192.             END
  193.         ELSE
  194.             writeln;
  195. 99 :
  196.     END;
  197.  
  198.  
  199. BEGIN   { main }
  200.     FlushEvents(EveryEvent, 0);
  201.     InitMenus;
  202.     init;
  203.     REPEAT
  204.         IF state = starting THEN
  205.             BEGIN
  206.                 writeln('Get Ready!');
  207.                 writeln;
  208.                 writeln('Trial' : 12, 'Time' : 9, 'Mean' : 8);
  209.                 state := running;
  210.             END;
  211.         IF state = running THEN
  212.             DoOneTrial;
  213.         HandlerEvents;
  214.     UNTIL state = Done;
  215.     KillTimer;
  216. END.